package jvm.VMExecSubsystem;

/**
 * 单分派、多分派演示
 * @author msi
 */
public class Dispatch {

    static class QQ {}

    static class _360 {}

    public static class Father {
        public void hardChoice(QQ arg) {
            System.out.println("father choose qq");
        }

        public void hardChoice(_360 arg) {
            System.out.println("father choose 360");
        }
    }

    public static class Son extends Father {
        public void hardChoice(QQ arg) {
            System.out.println("son choose qq");
        }

        public void hardChoice(_360 arg) {
            System.out.println("son choose 360");
        }
    }

    public static void main(String[] args) {
        Father father = new Father();
        Father son = new Son();
        father.hardChoice(new _360());
        son.hardChoice(new QQ());
    }
}
/**
 * 方法的接受者与方法的参数统称为方法的宗量
 * 结果：
 *      father choose 360
 *      son choose qq
 *      这里可以看出 在编译阶段中 java虚拟机判断方法的版本规则则是根据 1. 这个对象的静态类型(编译期间只能知道对象的静态类型，只有运行的时候才知道对象的动态类型)是 Father 还是 Son
 *          2. 这个方法的入参是 QQ 还是 _360。 这是两个宗量，所以这是静态多分派，
 *      在运行期间，比如解析  son.hardChoice(new QQ()); 这条指令是 使用的是字节码 invokevirtual 指令，这个指令已经不关心 QQ的子类是什么了(对结果没有影响)，它唯一关心的是 这个对象的实际类型是 Father 还是 Son，
 *          这是一个宗量， 所以时动态单分派。
 *      目前来看(知道写这本书时最新的 JDK12)，java语言是一门“静态多分派，动态单分派”的语言。
 */
